#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
 #include <sys/stat.h>
#include <string.h>
using namespace std;
key_t CreateFtok()
{
    //创建key值
    return ftok(".",1);
}

int CreateShm(key_t key)
{
    umask(0);
    int ret=shmget(key,4096,IPC_CREAT|IPC_EXCL|0666);
    if(ret==-1)
    {
        cout<<strerror(errno)<<endl;
        
        exit(-1);
    }
    return ret;
}

int GetShm(key_t key)
{
    int ret=shmget(key,4096,IPC_CREAT);
    if(ret==-1)
    {
        cout<<strerror(errno)<<endl;
        exit(-3);
    }
    return ret;
}

char* AttachShm(int shmid)
{
    return (char*)shmat(shmid,nullptr,0); 
}

void DeleteShm(int shmid)
{
    shmctl(shmid,IPC_RMID,nullptr);
}

void DetachShm(void* ptr)
{
    shmdt(ptr);
}
// #define pathname "."
// #define project_id 1
// #define SIZE 4096
// key_t CreateFtok()
// {
//     return ftok(pathname, 1);
// }

// // 创建共享内存
// int CreateShm(key_t k)
// {
//     umask(0);
//     int n = shmget(k, SIZE, IPC_CREAT | IPC_EXCL|0666);
//     if (n < 0)
//     {
//         cout << errno << ":" << strerror(errno) << endl;
//         exit(-1);
//     }
//     return n;
// }

// // 获取共享内存
// int GetShm(key_t k)
// {
//     int n = shmget(k, SIZE, IPC_CREAT);
//     if (n < 0)
//     {
//         cout << errno << ":" << strerror(errno) << endl;
//         exit(-1);
//     }
//     return n;
// }

// //删除共享内存
// void DeleteShm(int shmid)
// {
// shmctl(shmid,IPC_RMID,nullptr);
// }


// //连接共享内存
// char* AttachShm(int shmid)
// {
// return (char*)shmat(shmid,nullptr,0);
// }


// //脱离共享内存
// void DetachShm(char * addr)
// {
// shmdt(addr);
// }